package es.deusto.herotactics.ingameandroid;

import mapa.Coordenada;
import terrenos.Terreno;
import unidades.UnidadHT;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Typeface;
import es.deusto.herotactics.ingameandroid.botones.BotonAtacar;
import es.deusto.herotactics.ingameandroid.botones.BotonAtras;
import es.deusto.herotactics.ingameandroid.botones.BotonMover;
import es.deusto.herotactics.ingameandroid.botones.BotonRegenerar;
import es.deusto.herotactics.utils.SurfaceTweaks;
import exceptions.PlayerWonException;

/**
 * Celda del mapa. Almacena su posición en el mapa, su tamaño, el tipo de terreno que es, la unidad
 * que contiene y el estado de la celda.
 * 
 * @author Ibai
 *
 */
public class Celda {
	private Coordenada posicionMapa;
	private int tamanyo;
	private Bitmap imagenTerreno;
	private Bitmap imagenUnidad;
	private String vidaUnidad;
	private PantallaAndroid origen;
	private EstadoCelda estado;
	private int highlightAlpha;
	private int highlightRed;
	private int highlightGreen;
	private int highlightBlue;
	
	private String imagesFolder;
	
	private int opacity = 100;

	/**
	 * Constructor de la celda
	 * 
	 * @param origen Pantalla en el que está la celda
	 * @param posicion Posición que representa la celda
	 * @param tamanyo Tamaño de la celda
	 * @param imagesFolder Carpeta en la que están las fotos
	 */
	public Celda(PantallaAndroid origen, Coordenada posicion, int tamanyo, String imagesFolder) {
		super();
		this.imagesFolder = imagesFolder;
		this.origen = origen;
		this.posicionMapa = posicion;
		this.tamanyo = tamanyo;
		Terreno terreno = (Terreno) origen.getPartida().getMapa().getCasilla(posicionMapa);
		imagenTerreno = BitmapFactory.decodeFile(imagesFolder+"Terrenos/"+terreno.getId()+".png");
		imagenTerreno = SurfaceTweaks.resizeBitmap(imagenTerreno, tamanyo, tamanyo);
		this.actualizarCelda();
	}
	
	/**
	 * Devuelve la posición en el mapa en la que está la celda
	 * 
	 * @return posición de la celda
	 */
	public Coordenada getPosicionMapa() {
		return posicionMapa;
	}
	
	/**
	 * Devuelve el tamaño de la celda
	 * 
	 * @return tamaño de la celda
	 */
	public int getTamanyo() {
		return tamanyo;
	}
	
	/**
	 * Devuelve opacidad de la capa superior de la celda (efecto de iluminación
	 * 
	 * @return Opacidad de la capa superior de la celda (efecto de iluminación
	 */
	public int getOpacity() {
		return opacity;
	}
	
	/**
	 * Fija la opacidad de la capa superior
	 * 
	 * @param op Opacidad
	 */
	public void setOpacity(int op) {
		opacity = op;
	}
	
	/**
	 * Fijar el tamaño de la celda
	 * 
	 * @param tamanyo
	 */
	public void setTamanyo(int tamanyo) {
		this.tamanyo = tamanyo;
	}
	
	/**
	 * Devueleve el estado de la celda
	 * 
	 * @return El estado de la celda
	 */
	public EstadoCelda getEstado() {
		return estado;
	}
	
	/**
	 * Fija el estado de la celda
	 * 
	 * @param estado Estado de la celda
	 */
	public void setEstado(EstadoCelda estado) {
		this.estado = estado;
		switch (this.estado) {
		case MOVIBLE:
			setColors(opacity,0,255,0);
			break;
		case ATACABLE:
			setColors(opacity,255,0,0);
			break;
		case NORMAL:
			setColors(0,0,0,0);
			break;
		case DESACTIVADA:
			setColors(opacity, 0, 0, 0);
			break;
		default:
			throw new RuntimeException("Estado no válido");
		}
	}
	
	/**
	 * Fija los colores de la celda
	 * 
	 * @param a Canal alfa
	 * @param r Calal Red
	 * @param g Canal Green
	 * @param b Canal Blue
	 */
	private void setColors(int a, int r, int g, int b) {
		if (a>255 || a<0 || r>255 || r<0 || g>255 || g<0 || b>255 || b<0)
			throw new RuntimeException("Valores fuera de escala");
		highlightAlpha = a;
		highlightRed = r;
		highlightGreen = g;
		highlightBlue = b;
	}
	
	/**
	 * Método para dibujar la celda en la pantalla, aqui habrá que meter las imágenes de los terrenos
	 * 
	 * @param canvas El lienzo en el que e dibujan los objetos
	 * @param paint
	 * @param size El tamaño de la celda
	 * @param posicion La coordenada en la que se encuentra el objeto
	 */
	public void draw(Canvas canvas, Paint paint, Coordenada posicion) {
		int x = posicion.getX();
		int y = posicion.getY();
		paint.setColor(Color.BLACK);
//		canvas.drawRect(x, y, x+tamanyo, y+tamanyo, paint);
		canvas.drawBitmap(imagenTerreno, x+1, y+1, paint);
		canvas.drawLine(x, y+tamanyo, x+tamanyo, y+tamanyo, paint);
		canvas.drawLine(x+tamanyo, y+tamanyo, x+tamanyo, y, paint);
		if (imagenUnidad != null) {
			canvas.drawBitmap(imagenUnidad, x-1, y-5, paint);
//			paint.setColor(Color.BLACK);
//			canvas.drawText(vidaUnidad, x+2, y+tamanyo-1, paint);
			Paint strokePaint = new Paint();
			strokePaint.setARGB(255, 0, 0, 0);
		    strokePaint.setTextAlign(Paint.Align.CENTER);
		    strokePaint.setTextSize(12);
		    strokePaint.setTypeface(Typeface.DEFAULT_BOLD);
		    strokePaint.setStyle(Paint.Style.STROKE);
		    strokePaint.setStrokeWidth(2);
		    strokePaint.setAntiAlias(true);
		    
		    Paint textPaint = new Paint();
		    textPaint.setARGB(255, 255, 255, 255);
		    textPaint.setTextAlign(Paint.Align.CENTER);
		    textPaint.setTextSize(12);
		    textPaint.setTypeface(Typeface.DEFAULT_BOLD);
		    textPaint.setAntiAlias(true);

		    canvas.drawText(vidaUnidad, x+tamanyo/2, y+tamanyo-1, strokePaint);
		    canvas.drawText(vidaUnidad, x+tamanyo/2, y+tamanyo-1, textPaint);
		}
		if (estado != EstadoCelda.NORMAL) {
			paint.setARGB(highlightAlpha, highlightRed, highlightGreen, highlightBlue);
			canvas.drawRect(x+1, y+1, x+tamanyo, y+tamanyo, paint);
		}
	}
	
	/**
	 * Gestiona la pulsación en una celda
	 * 
	 * @param origen Desde donde se ha pulsado la celda
	 */
	public void touch () {
		
		CurrentAction accion = origen.getCurrentAction(true);
//		origen.setCoordActual(posicionMapa);
		if (accion == null && getEstado() != EstadoCelda.DESACTIVADA) {
			try {
				//Informar a la lógica de la pulsación
				UnidadHT unidad = (UnidadHT) origen.getModeloHT().accionEnCasilla(posicionMapa, null);
				if (unidad != null) {
					origen.getModeloHT().accionEnCasilla(posicionMapa, null);
					//comprobar la las acciones que puede hacer la unidad
					//Añadir botones al menú de contexto al pulsar una unidad
			        origen.getContexto().addBoton(new BotonAtacar(origen, unidad.puedeAtacar(), posicionMapa));
			        origen.getContexto().addBoton(new BotonMover(origen, unidad.puedeMover(), posicionMapa));
			        origen.getContexto().addBoton(new BotonRegenerar(origen, unidad.puedeRegenerar(), posicionMapa));
			        origen.getContexto().addBoton(new BotonAtras(origen, "Atrás"));
			        origen.getContexto().activar();
				}
			} catch (PlayerWonException e) {
				//no hacer nada, solo puede saltar al atacar
			}
		} else if (accion != null) {
//			origen.setCoordActual(posicionMapa);
			accion.next(posicionMapa);
		}
	}

	/**
	 * Actualiza los datos de la celda
	 */
	public void actualizarCelda() {
		UnidadHT unidad = (UnidadHT) origen.getPartida().getMapa().getContenidoCasilla(posicionMapa);
		if (unidad != null) {
			vidaUnidad = unidad.getVidaPartida()+"/"+unidad.VIDA_MAX;
			imagenUnidad = BitmapFactory.decodeFile(imagesFolder+"Unidades/"+unidad.getId()+".gif");
			imagenUnidad = SurfaceTweaks.resizeBitmap(imagenUnidad, tamanyo, tamanyo);
		} else {
			imagenUnidad = null;
			vidaUnidad = null;
			setEstado(EstadoCelda.NORMAL);
		}
	}
}
